home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mac Power 1997 December
/
MACPOWER-1997-12.ISO.7z
/
MACPOWER-1997-12.ISO
/
AMUG
/
PROGRAMMING
/
Raven 1.2 Examples.sit
/
Raven 1.2 Examples
/
Quill
/
Source
/
Document.cpp
< prev
next >
Wrap
Text File
|
1997-09-03
|
8KB
|
341 lines
/*
* File: Document.cpp
* Summary: Quill's document class.
* Written by: Jesse Jones
*
* Copyright ゥ 1996-1997 Jesse Jones.
* For conditions of distribution and use, see copyright notice in ZTypes.h
*
* Change History (most recent first):
*
* <3> 5/11/97 JDJ Keeps the resource fork open.
* <2> 5/04/97 JDJ Added mPensMap.
* <1> 8/09/96 JDJ Created
*/
#include "Document.h"
#include <Resources.h>
#include <ZDialogUtils.h>
#include <ZInput.h>
#include <ZResUtils.h>
#include <ZStringUtils.h>
#include "CustomClassDialog.h"
// ===================================================================================
// class CDocument
// ===================================================================================
//---------------------------------------------------------------
//
// CDocument::~CDocument
//
//---------------------------------------------------------------
CDocument::~CDocument()
{
if (mRsrcRefNum != kNoFileRefNum)
CloseResFile(mRsrcRefNum);
}
//---------------------------------------------------------------
//
// CDocument::CDocument
//
//---------------------------------------------------------------
CDocument::CDocument(MCommander* super) : TDocument(super), mWindowMap(new CResourceMap('Wind')), mViewMap(new CResourceMap('View')), mTraitsMap(new CResourceMap('Txtr')), mPensMap(new CResourceMap('Pen ')), mCustomPanes(new CCustomClasses)
{
mCreator = 'QUIL';
mFileType = 'RVob';
mWindowMap->AddListener(this);
mViewMap->AddListener(this);
mTraitsMap->AddListener(this);
mPensMap->AddListener(this);
mRsrcRefNum = kNoFileRefNum;
}
//---------------------------------------------------------------
//
// CDocument::HandleOpen
//
//---------------------------------------------------------------
void CDocument::HandleOpen(const TFileSpec& spec)
{
PRECONDITION(mRsrcRefNum == kNoFileRefNum);
Inherited::HandleOpen(spec);
mRsrcRefNum = FSpOpenResFile(mFileSpec, fsCurPerm);
ASSERT(ResError() == noErr); // we only keep the resource fork open so the editors have access to things like SPen and STextTrait resources so we shouldn't throw here
POSTCONDITION(true);
}
//---------------------------------------------------------------
//
// CDocument::HandleSave
//
//---------------------------------------------------------------
bool CDocument::HandleSave()
{
PRECONDITION(true);
if (mRsrcRefNum != kNoFileRefNum) {
CloseResFile(mRsrcRefNum); // so OnSave can delete the old file
mRsrcRefNum = kNoFileRefNum;
}
bool saved = Inherited::HandleSave(); // note that this traps exceptions
ASSERT(mRsrcRefNum == kNoFileRefNum);
mRsrcRefNum = FSpOpenResFile(mFileSpec, fsCurPerm);
ASSERT(ResError() == noErr);
POSTCONDITION(true);
return saved;
}
//---------------------------------------------------------------
//
// CDocument::HandleSaveAs
//
//---------------------------------------------------------------
bool CDocument::HandleSaveAs()
{
PRECONDITION(true);
if (mRsrcRefNum != kNoFileRefNum) {
CloseResFile(mRsrcRefNum); // so OnSave can delete the old file
mRsrcRefNum = kNoFileRefNum;
}
bool saved = Inherited::HandleSaveAs(); // note that this traps exceptions
ASSERT(mRsrcRefNum == kNoFileRefNum);
mRsrcRefNum = FSpOpenResFile(mFileSpec, fsCurPerm);
ASSERT(ResError() == noErr);
POSTCONDITION(true);
return saved;
}
//---------------------------------------------------------------
//
// CDocument::GetUniqueID
//
// Attempts to return the id of one of the 'View' or 'Wind'
// resources. (This will clash with an id in another document only
// if the 'View' or 'Wind' resource also clashes).
//
//---------------------------------------------------------------
ResID CDocument::GetUniqueID(ResType type) const
{
ResID id;
if (mWindowMap->GetNumResources() > 0)
id = mWindowMap->GetLastResourceID();
else if (mViewMap->GetNumResources() > 0)
id = mViewMap->GetLastResourceID();
else if (mTraitsMap->GetNumResources() > 0)
id = mTraitsMap->GetLastResourceID();
else if (mPensMap->GetNumResources() > 0)
id = mPensMap->GetLastResourceID();
else
id = Unique1ID(type);
return id;
}
#pragma mark ハ
//---------------------------------------------------------------
//
// CDocument::Invariant
//
//---------------------------------------------------------------
void CDocument::Invariant() const
{
Inherited::Invariant();
if (mOnDisk)
ASSERT(mRsrcRefNum != kNoFileRefNum);
else
ASSERT(mRsrcRefNum == kNoFileRefNum);
}
//---------------------------------------------------------------
//
// CDocument::OnBroadcast
//
//---------------------------------------------------------------
void CDocument::OnBroadcast(const SResourceMapMessage& mesg)
{
#pragma unused(mesg)
if (!this->IsDirty())
this->OnSetDirty(true);
this->Broadcast(SDocumentMessage(this, kChangedDocument));
}
//---------------------------------------------------------------
//
// CDocument::OnSetDirty
//
//---------------------------------------------------------------
void CDocument::OnSetDirty(bool dirty)
{
Inherited::OnSetDirty(dirty);
if (!dirty) {
mWindowMap->ClearDirty();
mViewMap->ClearDirty();
mTraitsMap->ClearDirty();
mPensMap->ClearDirty();
}
}
//---------------------------------------------------------------
//
// CDocument::OnSaveRsrcFork
//
//---------------------------------------------------------------
void CDocument::OnSaveRsrcFork(const TFileSpec& spec)
{
if (mRsrcRefNum == kNoFileRefNum)
Inherited::OnSaveRsrcFork(spec);
else {
TSaveResFile save(mRsrcRefNum);
this->OnSaveResources();
}
}
//---------------------------------------------------------------
//
// CDocument::OnOpenResources
//
//---------------------------------------------------------------
void CDocument::OnOpenResources()
{
Inherited::OnOpenResources();
mWindowMap->ReadResources();
mViewMap->ReadResources();
mTraitsMap->ReadResources();
mPensMap->ReadResources();
mCustomPanes->ReadResources();
}
//---------------------------------------------------------------
//
// CDocument::OnSaveResources
//
//---------------------------------------------------------------
void CDocument::OnSaveResources()
{
Inherited::OnSaveResources();
mWindowMap->WriteResources();
mViewMap->WriteResources();
mTraitsMap->WriteResources();
mPensMap->WriteResources();
ResID id = this->GetUniqueID(CCustomClasses::kType);
mCustomPanes->WriteResources(id);
}
//---------------------------------------------------------------
//
// CDocument::OnMenuCommand
//
//---------------------------------------------------------------
bool CDocument::OnMenuCommand(const MenuCommand& command)
{
bool handled = true;
if (command == "Add Custom Class") {
static string base = "TView";
string derived = base;
if (CCustomClassDialog::Pose(&base, &derived))
mCustomPanes->AddClass(derived, base);
} else if (command == "Remove Custom Class") {
string customClass; // ・・ハuse some sort of picker dialog
if (::GetString(LoadAppString("Class to Delete:"), &customClass)) {
if (mCustomPanes->HasClass(customClass))
mCustomPanes->RemoveClass(customClass);
else
DoStop(LoadAppString("Couldn't delete the class"), LoadAppString("Couldn't find ") + customClass);
}
} else if (mCustomPanes->HasClass(command)) {
string baseClass = mCustomPanes->GetBaseClass(command);
if (::GetString(LoadAppString("Base Class:"), &baseClass)) {
mCustomPanes->RemoveClass(command);
mCustomPanes->AddClass(command, baseClass);
}
} else
handled = Inherited::OnMenuCommand(command);
return handled;
}
//---------------------------------------------------------------
//
// CDocument::OnCommandStatus
//
//---------------------------------------------------------------
bool CDocument::OnCommandStatus(const MenuCommand& command, SCommandStatus& status)
{
bool handled = true;
if (command == "Custom Classes")
status.enabled = true;
else if (command == "Add Custom Class")
status.enabled = true;
else if (command == "Remove Custom Class")
status.enabled = mCustomPanes->GetNumClasses() > 0;
else if (mCustomPanes->HasClass(command))
status.enabled = true;
else
handled = Inherited::OnCommandStatus(command, status);
return handled;
}